/*
 * RelaisCardController.h
 *
 *  Created on: 14.05.2009
 *      Author: michael
 */

#ifndef RELAISCARDCONTROLLER_H_
#define RELAISCARDCONTROLLER_H_

/**
 *
 * EXCEPTIONS
 *
 */
#define	FALSE_CHECKSUM	"Falsche Checksumme wurde festgestellt!\n"
#define NO_CARD			"Es wurde keine Relaiskarte gefunden!\n"
#define CARD_NOT_FOUND	"Karte ist nicht verfuegbar!\n"
#define NO_ANSWER		"Es wurde keine gültige Antwort empfangen!\n"
#define MAX_CARDS		"Maximale Anzahl an Karten erreicht!\n"

/**
 *
 * Komandos AN die Relaiskarte
 *
 */
#define CMD_NOP		0	// No Operation
#define CMD_INIT	1	// Initialisierung
#define CMD_GET		2	// Statusabfrage
#define CMD_SET		3	// Schalten / Setzen
#define CMD_GET_O	4	// Optionen abfragen
#define CMD_SET_O	5	// Optionen setzen
#define CMD_S_ON	6	// Gewählte Relais einschalten
#define CMD_S_OFF	7	// Gewählte Relais ausschalten
#define CMD_TOGGLE	8	// Relaiszustand wechseln (Ein->Aus / Aus->Ein)
/**
 *
 * Komandos VON der Relaiskarte
 *
 */
#define GET_NOP		255	// NOP
#define GET_INIT	254	// Initialisierung
#define GET_GET		253	// Statusabfrage
#define GET_SET		252	// Schalten / Setzen
#define GET_GET_O	251	// Optionen empfangen
#define GET_SET_O	250	// Optionen gesetzt
#define GET_S_ON	249	// Gewählte Relais einschalten
#define GET_S_OFF	248	// Gewählte Relais ausschalten
#define GET_TOGGLE	247	// Relaiszustand wechseln (Ein->Aus / Aus->Ein)
/**
 *
 * RS-232 Parameter fuer Relaiskarte
 *
 */
#define DATABYTES	4				// Anzahl der Datenbytes der Uebertragung

#define ERROR		-1
#define OK			0

#include "SerialComm.h"
#include "RelaisCardModel.h"
#include <iostream>
#include <stdexcept>

using namespace std;

class RelaisCardController {
private:

	SerialComm *port;
	RelaisCardModel model;

	/************* Initialisierung & Deinitialisierung *************/
	void init( void ) throw (exception);
	void getPort( void );
	void quit( void );

	/************* Senden & Empfangen ****************/
	int receiving( void );
	void receive( void ) throw (exception);
	int send(unsigned char command, unsigned char card_nr, unsigned char value);

	unsigned char buildCRC(unsigned char cmd1, unsigned char cmd2, unsigned char cmd3);

public:

	RelaisCardController(const char* device);
	RelaisCardController(const char* device, const RelaisCardModel& modell);
	virtual ~RelaisCardController();

	void print( void );
	void setModel(RelaisCardModel& model){ this->model = model; };

	/************* Zugriffsmethoden zum ändern des Schaltzustandes ******************/
	void setRelais(unsigned char card, unsigned char relais, bool flag);
};

#endif /* RELAISCARDCONTROLLER_H_ */
